package network_programming.np1_socket_and_serversocket;

import java.io.IOException;
import java.net.InetAddress;

public class InetAddressDemo {
    /**
     * InetAddress类的静态工厂方法
     * InetAddress.getByName()      构造自身实例
     * */
    public void test() {
        try {
            InetAddress address = InetAddress.getByName("221.3.5.8");   // 返回代表“221.3.5.8” =的IPv4地址
            InetAddress address1 = InetAddress.getByName("www.csdn.net");   // 返回代表“www.java.net” =的IP地址
            System.out.println(address + "\n" + address1);
            System.out.println(address.getHostName());      // 获取主机名并打印
            System.out.println(address1.getHostName());
            System.out.println(address1.getCanonicalHostName());    // 获取主机名并打印
            /*
            * InetAddress
            *
            * getHostName()     首先从DNS缓存中查找与ip地址匹配的主机名，如果不存在则通过DNS服务器查找，
            *                   如果找到则返回主机名，否则返回ip地址
            *
            * getCanonicalHostName()    通过DNS服务器查找与ip地址匹配的主机名，如果找到则返回主机名，否则返回ip地址
            *
            *
            *
            * 测试能否从本地主机连接到特定主机
            * public boolean isReachable(int timeout) throws IOException
            * public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException
            * 如果远程主机在参数timeout（单位ms）指定的时间做出回应，则以上两方法返回true，否则返回false
            * 如果出现网络错误则抛出IOException
            * 第二种方法允许从第一个参数指定的本地网络接口建立连接，以及ttl生存时间（指IP数据包被丢弃前允许存在的时间）
            * */
            InetAddress address2 = InetAddress.getByName("www.csdn.net");
            System.out.println(address2.isReachable(1000));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        InetAddressDemo iad = new InetAddressDemo();
        iad.test();
    }
}
